﻿using System.ComponentModel;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using TeacherLoad.Classes;

namespace TeacherLoad.Windows
{
    /// <summary>
    /// Логика взаимодействия для AcadItems.xaml
    /// </summary>
    public partial class AcadItems : Window
    {
        private bool _editMode = false;
        private int _id = 0;
        private AcademicItem _item = new AcademicItem();
        private List<AcademicItem> _itemList = new List<AcademicItem>();
        private readonly List<AcademicItem> _emptyItemList = new List<AcademicItem>()
        {
            new AcademicItem()
        };
        public AcadItems()
        {
            InitializeComponent();
            DataListItems.DataContext = LoadItems();
            cbListItems.Items.SortDescriptions.Add(new SortDescription("ItemName", ListSortDirection.Ascending));
            listItem.Items.SortDescriptions.Add(new SortDescription("ItemName", ListSortDirection.Ascending));
            txItem.Focus();
        }

        private List<AcademicItem> LoadItems()
        {
            DataTable dt = SendToServer.GetItems();
            _itemList = new List<AcademicItem>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    AcademicItem item = new AcademicItem(
                        Convert.ToInt32(row[0]),
                        row[1].ToString());
                    _itemList.Add(item);
                }
                ChangeRow.IsEnabled = true;
            }
            else
            {
                _itemList = _emptyItemList;
                ChangeRow.IsEnabled = false;
            }
            return _itemList;
        }

        private void btnAddItem_Click(object sender, RoutedEventArgs e)
        {
            // Проверяем, что обзательные поля заполнены (краткое наименование дисциплины)
            if (txItem.Text == string.Empty)
            {
                MessageBox.Show("Укажите наименование дисциплины", "Заполните обязательное поле",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            AcademicItem item = new AcademicItem(_id, txItem.Text);
            if (_editMode)
            {
                // Изменение записи
                if (SendToServer.EditItem(item))
                {
                    ClearTextBox();     // Очищаем поля ввода
                    UpdateUi();         // Обновляем интерфейс
                    _editMode = false;  // Выходим из режима редактирования
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else if (!ItemInList(_itemList, txItem.Text))
            {
                if (SendToServer.AddItem(item))
                {
                    ClearTextBox();     // Очищаем поля ввода
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else
            {
                MessageBox.Show("Указанная дисциплина уже есть в списке",
                    "Проверьте данные",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
            }
            DataListItems.DataContext = LoadItems();
            txItem.Focus();
        }

        // Проверка существования дисциплины в списке
        private bool ItemInList(List<AcademicItem> list, string item)
        {
            if (list.Count == 0) { return false; }
            foreach (AcademicItem it in list)
            {
                if (it.ItemName == item)
                {
                    return true;
                }
            }
            return false;
        }


        private void listItem_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (listItem.SelectedItems.Count > 0)
            {
                _item = listItem.SelectedItem as AcademicItem;
            }
        }

        private void ChangeRow_Click(object sender, RoutedEventArgs e)
        {
            if (listItem.SelectedItems.Count > 0)
            {
                _editMode = true;   // Установка режима редактирования

                HeaderItemAdd.Header = "Обновить данные";
                btnAddItem.Content = "Обновить";
                btnCancelEdit.Visibility = Visibility.Visible;

                txItem.Text = _item.ItemName;

                // Получаем идентификатор (id) выделенной дисциплины
                _id = _item.Id;
            }
        }

        // Сообщение об ошибке записи
        private void MessageError()
        {
            MessageBox.Show("Ошибка записи", "Неудача",
                        MessageBoxButton.OK, MessageBoxImage.Error);
        }

        // Очистка полей ввода (если запись была успешной)
        private void ClearTextBox()
        {
            txItem.Clear();
        }

        // Одновление интерфейса после успешной операции обновления данных
        private void UpdateUi()
        {
            HeaderItemAdd.Header = "Новая дисциплина";
            btnAddItem.Content = "Добавить дисциплину";
            btnCancelEdit.Visibility = Visibility.Collapsed;
            btnClearText.Visibility = Visibility.Collapsed;
            _editMode = false;
        }

        private void btnCancelEdit_Click(object sender, RoutedEventArgs e)
        {
            UpdateUi();
            ClearTextBox();
        }

        private void DoubleRow_Click(object sender, RoutedEventArgs e)
        {
            if (listItem.SelectedItems.Count > 0)
            {
                txItem.Text = _item.ItemName;
            }
        }

        private void btnClearText_Click(object sender, RoutedEventArgs e)
        {
            ClearTextBox();
        }

        private void txItem_TextChanged(object sender, TextChangedEventArgs e)
        {
            if ((txItem.Text.Length > 0) && (!_editMode))
            {
                btnClearText.Visibility = Visibility.Visible;
            }
            else
            {
                btnClearText.Visibility= Visibility.Collapsed;
            }
        }

        private void cbListItems_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var newList = new List<AcademicItem>();
            
            var predmet = cbListItems.SelectedItem as AcademicItem;
            if (predmet != null)
            {
                foreach (var item in _itemList)
                {
                    if (predmet.ItemName == item.ItemName)
                    { newList.Add(item); }
                }
                listItem.DataContext = newList;
            }
            else
            {
                listItem.DataContext = _itemList;
            }
        }
    }
}
